systemd-一些记录

趁热打铁看了些RH中systemd的知识,简单记录总结如下

需求分析

结合之前定位的mariadb启动失败,简单分析下对systemd的需求

  • 怎么管理service
  • 怎么添加/修改/删除service
  • 基本的概念&结构,包括配置

大概如上面四点吧,下面记录下在看幸福同学的ppt+RH的官网文档时,一些心得吧。

RH文档

地址戳左边:chap-Managing_Services_with_systemd

文章很长很详细,记录些关键地方,方便查询

config的位置

  • /usr/lib/systemd/system/
    • rpm installed
  • /run/systemd/system/
    • runtime
  • /etc/systemd/system/
    • systemctl enable

优先顺序是:etc 》 run 》 usr

main features

  • 并发性依赖于.socket
  • 另外支持的启动方式:device,D-Bus,Path
  • Transactional unit activation logic
    • 会计算service之间的dependencies,如果出现cycle,会remove non-essential jobs

常见的管理cmd

除了start stop啥的,比较有用的

systemctl list-units --type service
systemctl list-units --type service --all

用他的目的是能按照类型去查询unit,并看对应的状态。俩命令的区别是unit是否active。

systemctl list-unit-files

这个呢列出的是所有的unit,不管是enable还是disable。这个命令下,output中的STATE有三个值,分别是:

  • disable
  • enable
  • static
    • 不能通过systemctl enable/disable来管理,但是可以被别的服务拉起,通过配置wants&requires

而在systemctl中有针对enable&active的单个查询,如下:

systemctl is-enable xxx
systemctl is-active xxx

一个unit从install==》enable,才会可用;然后通过active来标记了当前服务的runtime状态

另一个比较好使的就是dependency的查看咯

systemctl list-dependencies --before/after

用mariadb举个简单例子:

systemctl list-d
mariadb.service
● ├─-.mount
● ├─system.slice
● ├─systemd-journald.socket
● ├─basic.target
● ├ 省略了basic.target下属的unit
● ├─network.target
● │ ├─firewalld.service
● │ ├─netcf-transaction.service
● │ ├─network.service
● │ └─network-pre.target
● └─syslog.target

为啥呢?看下mariadb.service

[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql

ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

# Place temp files in a secure directory, not /tmp
PrivateTmp=true

[Install]
WantedBy=multi-user.target

so起作用的有三个配置:

WantedBy=multi-user.target
After=syslog.target
After=network.target

写一个service文件

具体配置的话,man systemctl最全面,官网文档只是一部分哟

requires&wants跟after&before的区别

区别就是在是否拉起来对应的服务。顾名思义,after是在对应service之前运行的意思。但是:

Unlike Requires, After does not explicitly activate the specified units.

而requires和wants的区别是,所需service启动失败后,是否继续启动当前service。requires是不启动,而wants会尝试启动。

改动service文件后

一定要重启:systemctl daemon-reload,然后在start/reload对应的服务

参考文档列表